﻿//#define DEBUG

using System;
using System.Windows.Forms;
using CompAccount;
using Func;
using UAF.Runtime;
using VLFS;

namespace VLF {
  public partial class MainForm : Form {
    // индексы массива параметров
    // журнал
    const int LOGFILE = 4;
    // тип события
    const int EVENTTYPE = 5;
    // начальная дата периода
    const int BEGDATE = 6;
    // конечная дата периода
    const int ENDDATE = 7;
    // путь к основному приложению
    const int PATHAPP = 8;
    // длина массива параметров
    const int LENGTH_PAR = 9;

    public static DescrServ DS;
    int IndexHost = -1;
    string Logfile = "";
    string PathApp = "";
    // объект интерпретатора Alfa
    AlfaRun Alfa;

    public MainForm () {
      InitializeComponent();

      DS = new DescrServ();
      DS.NameApp = "VLF v1.2 UAF";
      // установить время периода
      dtpBegDate.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                      DateTime.Now.Day, 0, 0, 0);
      dtpEndDate.Value = DateTime.Now;

      // деактивировать элементы основной формы
      lbLogfile.Enabled = false;
      cbLogfile.Enabled = false;
      lbTypeEvent.Enabled = false;
      clbTypeEvent.Enabled = false;
      lbBegPeriod.Enabled = false;
      dtpBegDate.Enabled = false;
      lbEndPeriod.Enabled = false;
      dtpEndDate.Enabled = false;
      btRun.Enabled = false;
    }

    // обработчик отображения формы
    private void MainForm_Shown (object sender, EventArgs e) {
      try {
#if DEBUG
        PathApp = @"d:\User\C#\VLF\VLF";
#else
        PathApp = App.GetPath("VLF");
#endif
      }
      catch (Exception Err) {
        MessageBox.Show("Приложение VLF: " + Err.Message,
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }
      DS.ReadFile(PathApp + @"\computer.txt");
      for (int i = 0; i < DS.Count; i++) {
        cbHost.Items.Add(DS.GetName(i));
      }
      if (DS.Count > 0) {
        cbHost.Text = DS.GetName(0);
        cbHost.SelectedIndex = 0;
      }
    }

    // обработчик выбора поля Host в основной форме
    private void cbLogfile_SelectionChangeCommitted (object sender, EventArgs e) {
      Logfile = (string)cbLogfile.SelectedItem;
      clbTypeEvent.Items.Clear();
      if (Logfile == "Security") {
        clbTypeEvent.Items.AddRange(
          new Object[] {
            "Аудит - успех",
            "Аудит - отказ"
          }
        );
      }
      else {
        clbTypeEvent.Items.AddRange(
          new Object[] {
            "Ошибка",
            "Предупреждение",
            "Уведомление"
          }
        );
      }
      lbTypeEvent.Enabled = true;
      clbTypeEvent.Enabled = true;
      lbBegPeriod.Enabled = false;
      dtpBegDate.Enabled = false;
      lbEndPeriod.Enabled = false;
      dtpEndDate.Enabled = false;
      btRun.Enabled = false;
    }

    private void clbTypeEvent_SelectedIndexChanged (object sender, EventArgs e) {
      if (clbTypeEvent.CheckedIndices.Count > 0) {
        lbBegPeriod.Enabled = true;
        dtpBegDate.Enabled = true;
        lbEndPeriod.Enabled = true;
        dtpEndDate.Enabled = true;
        btRun.Enabled = true;
      }
      else {
        lbBegPeriod.Enabled = false;
        dtpBegDate.Enabled = false;
        lbEndPeriod.Enabled = false;
        dtpEndDate.Enabled = false;
        btRun.Enabled = false;
      }
    }

    private void dtpBegDate_ValueChanged (object sender, EventArgs e) {
      if (dtpBegDate.Value.ToString("yyyy.MM.dd") == DateTime.Now.ToString("yyyy.MM.dd"))
        dtpEndDate.Value = DateTime.Now;
      else
        dtpEndDate.Value = dtpBegDate.Value.AddDays(1);
    }

    private void btRun_Click (object sender, EventArgs e) {
      // массив параметров
      string[] Param;

      if (cbHost.SelectedIndex == -1) {
        MessageBox.Show("Незаполнено поле: Сервер!",
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }
      if (cbLogfile.SelectedIndex == -1) {
        MessageBox.Show("Незаполнено поле: Журнал!",
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }
      if (clbTypeEvent.CheckedIndices.Count == 0) {
        MessageBox.Show("Невыбран элемент: Тип события!",
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }
      if (dtpEndDate.Value.CompareTo(dtpBegDate.Value) < 0) {
        MessageBox.Show("Конечное значение периода меньше начального значения!",
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }
      if (dtpEndDate.Value.Subtract(dtpBegDate.Value).Days > 1) {
        MessageBox.Show("Значение периода больше 24 часов!",
                        "Ошибка",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
        return;
      }

      IndexHost = cbHost.SelectedIndex;
      // установить передаваемые параметры
      // получить параметры сервера (длина массива Param равна 4)
      Param = DS.GetArrParam(IndexHost);
      // изменить количество элементов в массиве параметров
      Array.Resize(ref Param, LENGTH_PAR);
      Param[LOGFILE] = (string)cbLogfile.SelectedItem;
      int I = 0;
      string EventType = "";
      if ((string)cbLogfile.SelectedItem == "Security") {
        foreach (int Index in clbTypeEvent.CheckedIndices) {
          if (I == 0)
            EventType = (Index + 4).ToString();
          else
            EventType += "," + (Index + 4).ToString();
          I++;
        }
      }
      else {
        foreach (int Index in clbTypeEvent.CheckedIndices) {
          if (I == 0)
            EventType = (Index + 1).ToString();
          else
            EventType += "," + (Index + 1).ToString();
          I++;
        }
      }
      Param[EVENTTYPE] = EventType;
      Param[BEGDATE] = dtpBegDate.Value.ToString("yyyy.MM.dd HH:mm:ss");
      Param[ENDDATE] = dtpEndDate.Value.ToString("yyyy.MM.dd HH:mm:ss");
      Param[PATHAPP] = PathApp;
      Application.DoEvents();
      Cursor = Cursors.WaitCursor;
      try {
        // создать объект для выполнения программы CreateEventLog.alfc
#if DEBUG
        Alfa = new AlfaRun(PathApp + @"\scripts\createeventlog.alf", true);
#else
        Alfa = new AlfaRun(PathApp + @"\scripts\createeventlog.alfc", true);
#endif
        // выполнить программу
        int Result = (int)Alfa.Run(Param);
        if (Result > 0) {
          MessageBox.Show("Приложение CreateEventLog.\n" + "Ошибка!\n" +
                          "Смотри createeventlog.log",
                          "Ошибка",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Error);
          return;
        }
      }
      finally {
        // освободить занятые ресурсы
        Alfa.Close();
        Cursor = Cursors.Arrow;
      }
    }

    private void btExit_Click (object sender, EventArgs e) {
      this.Close();
      Application.Exit();
    }

    private void btServ_Click (object sender, EventArgs e) {
      //      DS.ReadFile(PathApp + @"\computer.txt");
      ServForm Dialog = new ServForm();
      if (Dialog.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) {
        cbHost.Items.Clear();
        for (int i = 0; i < DS.Count; i++) {
          cbHost.Items.Add(DS.GetName(i));
        }
        if (DS.Count > 0)
          cbHost.Text = DS.GetName(0);
        //        cbHost.SelectedIndex = -1;
        cbLogfile.Items.Clear();
        cbLogfile.Text = "";
        cbLogfile.SelectedIndex = -1;
        clbTypeEvent.Text = "";
        clbTypeEvent.Items.Clear();
        lbTypeEvent.Enabled = false;
        clbTypeEvent.Enabled = false;
        lbBegPeriod.Enabled = false;
        dtpBegDate.Enabled = false;
        lbEndPeriod.Enabled = false;
        dtpEndDate.Enabled = false;
        btRun.Enabled = false;
        Dialog.Close();
        if (DS.Status == DescrServ.DataStatus.OK) {
          cbHost_SelectedIndexChanged(null, null);
        }
      }
      else {
        Dialog.Close();
      }
    }

    private void cbHost_SelectedIndexChanged (object sender, EventArgs e) {
      string[] Param;

      cbLogfile.Items.Clear();
      cbLogfile.Text = "";
      cbLogfile.SelectedIndex = -1;
      clbTypeEvent.Items.Clear();
      clbTypeEvent.Text = "";
      lbTypeEvent.Enabled = false;
      clbTypeEvent.Enabled = false;
      lbBegPeriod.Enabled = false;
      dtpBegDate.Enabled = false;
      lbEndPeriod.Enabled = false;
      dtpEndDate.Enabled = false;
      btRun.Enabled = false;
      IndexHost = cbHost.SelectedIndex;
      Param = DS.GetArrParam(IndexHost);
      Cursor = Cursors.WaitCursor;
      try {
        // создание объекта для выполнения программы getlistlogfile.alfc
#if DEBUG
        Alfa = new AlfaRun(PathApp + @"\scripts\getlistlogfile.alf", true);
#else
        Alfa = new AlfaRun(PathApp + @"\scripts\getlistlogfile.alfc", true);
#endif
        // выполнение программы и получение кода завершения
        Object Result = Alfa.Run(Param);
        // загружаем значения в cbLogfile
        string[] Arr = (string[])Result;
        if (Arr == null || Arr.Length == 0) {
          MessageBox.Show("Приложение GetListLogfile.\n" +
                          "Невозможно получить список журналов событий!\n" +
                          "Смотри gelistlogfile.log",
                          "Ошибка",
                           MessageBoxButtons.OK,
                           MessageBoxIcon.Error);
          return;
        }
        for (int i = 0; i < Arr.Length; i++)
          cbLogfile.Items.Add(Arr[i]);
        cbLogfile.Text = Arr[0];
        lbLogfile.Enabled = true;
        cbLogfile.Enabled = true;
      }
      finally {
        // освобождение занятых ресурсов
        Alfa.Close();
        Cursor = Cursors.Arrow;
      }

    }

    // вывод подсказки с установленным фоном и цветом
    private void ttHelp_Draw (object sender, DrawToolTipEventArgs e) {
      e.DrawBackground();
      e.DrawBorder();
      e.DrawText();
    }
  }

}


